﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using Npgsql;

namespace Ortodoctor.modelo
{
    public class conexao
    {
        public NpgsqlConnection conn;//
        //public string connectionstring = ("Server=186.202.152.64;Port=5432;User Id=euamoaparelho1;Password=DycbqDfHLI;Database=euamoaparelho1;MinPoolSize=5;CommandTimeout=10000;");
        public string connectionstring = ("Server=localhost;Port=5432;User Id=postgres;Password=postgres;Database=ortodoctor1;MinPoolSize=5;CommandTimeout=60;");
        public static NpgsqlTransaction transacao;
        public static NpgsqlConnection con2 = new NpgsqlConnection("Server=localhost;Port=5432;User Id=postgres;Password=postgres;Database=ortodoctor1;MinPoolSize=5;CommandTimeout=60;");
        //public static NpgsqlConnection con2 = new NpgsqlConnection("Server=186.202.152.64;Port=5432;User Id=euamoaparelho1;Password=DycbqDfHLI;Database=euamoaparelho1;MinPoolSize=5;CommandTimeout=10000;");


        public conexao()
        {
            conn = new NpgsqlConnection(connectionstring);
        }

        ~conexao()
        {
            close();
        }

        public void open()
        {
            if (conn.State.ToString().Equals("Closed"))
            {
                conn.Open();
            }
        }

        public void close()
        {
            conn.Close();
        }



        //============================= CUIDADO AO UTILIZAR A TRANSAÇÃO ==================================

        // sempre fazer como abaixo, Ao abrir e fechar conexão quando em transação deve ser separadamente
        //
        /*
         
         Postgres.Open();
         Postgres.IniciaTransacao();
         // CÓDIGO DE INSERCAO, UPDATE, DELECAO E SELECAO
         Postgres.executeTransactionQuery(stringSql); 
         // Varias ações no banco
         bool retorno = Postgres.executeTransactionNonQuery(stringSql);
         retorno = retorno &&  Postgres.executeTransactionNonQuery(stringSql);
         retorno = retorno &&  Postgres.executeTransactionNonQuery(stringSql); 
         retorno = retorno &&  Postgres.executeTransactionNonQuery(stringSql);
         
         if(retorno) // em caso de tudo ter dado certo
            Postgres.Commit(); // comitar
         else
            Postgres.RollBack(); // reverter todas as alterações
         
         Postgres.Close();
         
         */
        //
        // Como a classe de conexão é estatica, todos compartilharão a mesma, logo o Open e o Close 
        // podem ser utilizados a qualquer momento antes e depois de efetuar as insercoes, POREM
        // CUIDADO para nao abrir varias conexoes para a mesma transacao, ou esquecer de finalizar 
        // a transacao, extremo cuidado ao utilizar este recurso..

        //========================================= FIM ===============================================

        public static DataTable executeTransactionQuery(string pSql)
        {
            DataTable dt = new DataTable();
            try
            {
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(pSql, con2);
                da.Fill(dt);
            }
            catch
            {
                dt = new DataTable();
            }
            return dt;
        }

        public static bool executeTransactionNonQuery(string pSql)
        {
            try
            {
                NpgsqlCommand com = new NpgsqlCommand(pSql, con2);
                com.ExecuteNonQuery();
                return true;
            }
            catch
            {
                return false;
            }
        }

        internal static void Open()
        {
            con2.Open();
        }

        internal static void IniciaTransacao()
        {
            transacao = (NpgsqlTransaction)con2.BeginTransaction();
        }

        internal static void Commit()
        {
            transacao.Commit();
        }

        internal static void RollBack()
        {
            transacao.Rollback();
        }

        internal static void Close()
        {
            con2.Close();
        }
    }
}
